package agenda.dao;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Vector;

import agenda.modelo.Contacto;

public class ContactoDAOVector implements InterfazContactoDAO, Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -2778825916975002347L;
	
	Vector<Contacto> v;
	int id;
	
	public ContactoDAOVector() {
		v = new Vector<Contacto>();
		id = 0;
	}
	
	@Override
	public void agregarContacto(Contacto contacto) throws SQLException {
		contacto.setIdContacto(++id);
		v.add(contacto);
	}

	@Override
	public boolean eliminarContacto(int idContacto) throws SQLException {
		Iterator<Contacto> it = v.iterator();
		while (it.hasNext()) {
			Contacto c= it.next();
			if(c.getIdContacto() == idContacto){
				it.remove();
				return true;
			}
		}
		return false;
	}


	@Override
	public ArrayList<Contacto> listaDeContactos() throws SQLException {
		ArrayList<Contacto> al = new ArrayList<Contacto>(v);
		return al;
	}

	@Override
	public ArrayList<Contacto> buscarContactosPorNombre(String palabra) throws SQLException {
		ArrayList<Contacto> al = new ArrayList<Contacto>();
		Iterator<Contacto> it = v.iterator();
		while (it.hasNext()) {
			Contacto contacto = (Contacto) it.next();
			if(buscaEnContacto(contacto, palabra)){
				al.add(contacto);
			}
		}
		return al;
	}

	@Override
	public Contacto consultarContacto(int idContacto) throws SQLException {
		Iterator<Contacto> it = v.iterator();
		while (it.hasNext()) {
			Contacto c= (Contacto) it.next();
			if(c.getIdContacto() == idContacto){
				return c;
			}
		}
		return null;
	}

	@Override
	public Contacto[] toArray() throws SQLException {
		return v.toArray(new Contacto[0]);
	}
	
	private boolean buscaEnContacto(Contacto contacto, String palabra){
		if(contacto.getApellidos().toLowerCase().indexOf(palabra.toLowerCase()) != -1){
			return true;
		}
		if(contacto.getNombre().toLowerCase().indexOf(palabra.toLowerCase()) != -1){
			return true;
		}
		if(contacto.getApodo().toLowerCase().indexOf(palabra.toLowerCase()) != -1){
			return true;
		}
		return false;
	}

	@Override
	public String[][] buscarContactosPorNombreToMatriz(String palabra)
			throws SQLException {
		ArrayList<Contacto> lista = buscarContactosPorNombre(palabra);
		String[] filas = new String[lista.size()];
		String[][] resultado;
		resultado = new String[filas.length][];
		for (int i = 0; i < filas.length; i++) {
			resultado[i] = lista.get(i).toArray();
		}
		return resultado;
	}

	@Override
	public int insertaLote(ArrayList<Contacto> lista) throws SQLException {
		for (Contacto contacto : lista) {
			contacto.setIdContacto(++id);			
		}
		v.addAll(lista);
		return lista.size();
	}

	@Override
	public void modificarContacto(Contacto contacto) throws SQLException {
		// No hay que hacer nada - Se modifica la referencia
	}

}
